package com.ruoyi.statisticalCenter.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Component // 标记为Spring组件以便自动注入
public class RedisUtil {

    @Autowired
    private StringRedisTemplate stringRedisTemplate; // 用于处理字符串类型数据

    @Resource
    private RedisTemplate<String, Object> redisTemplate; // 用于处理对象类型数据

    /**
     * 设置String类型的键值对，并指定过期时间
     *
     * @param key   键
     * @param value 值
     * @param timeout 过期时间（单位：秒）
     */
    public void setStringWithExpire(String key, String value, long timeout) {
        stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
    }

    /**
     * 获取String类型的值
     *
     * @param key 键
     * @return 值，若不存在则返回null
     */
    public String getString(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    // ...其他方法，如对List、Set、Hash、ZSet等数据结构的操作

    /**
     * 设置对象类型的键值对，并指定过期时间
     *
     * @param key   键
     * @param value 值（需要序列化为可存储的对象）
     * @param timeout 过期时间（单位：秒）
     */
    public void setObjectWithExpire(String key, Object value, long timeout) {
        redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
    }

    /**
     * 获取对象类型的值
     *
     * @param key 键
     * @param clazz 对象的类类型，用于反序列化
     * @param <T> 泛型类型
     * @return 反序列化后的对象，若不存在或反序列化失败则返回null
     */
    public <T> T getObject(String key, Class<T> clazz) {
        return (T) redisTemplate.opsForValue().get(key);
    }

    public void setObject(String key, Object value, long expireSec) {
        redisTemplate.opsForValue().set(key, value, expireSec, TimeUnit.SECONDS);
    }

    // ...其他针对对象类型的操作，可能需要使用到序列化器（如Jackson或Gson）以及自定义的序列化/反序列化方法

    // ...其他辅助方法，如判断键是否存在、删除键、批量操作等
}
